Bin,
Test,
Bench,
- Example,
+ ExampleLib(Vec<LibKind>),
+ ExampleBin,
CustomBuild,
}
impl Encodable for TargetKind {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
match *self {
- TargetKind::Lib(ref kinds) => {
- kinds.iter().map(|k| k.crate_type()).collect()
+ TargetKind::Lib(ref kinds) |
+ // TODO: I am not sure whether it should be encoded like a library or like an example
+ TargetKind::ExampleLib(ref kinds) => {
+ kinds.iter().map(LibKind::crate_type).collect()
}
TargetKind::Bin => vec!["bin"],
- TargetKind::Example => vec!["example"],
+ TargetKind::ExampleBin => vec!["example"],
TargetKind::Test => vec!["test"],
TargetKind::CustomBuild => vec!["custom-build"],
TargetKind::Bench => vec!["bench"],
}
}
- pub fn example_target(name: &str, src_path: PathBuf) -> Target {
+ pub fn example_target(name: &str,
+ crate_targets: Vec<LibKind>,
+ src_path: PathBuf) -> Target {
+ let kind = if crate_targets.is_empty() {
+ TargetKind::ExampleBin
+ } else {
+ TargetKind::ExampleLib(crate_targets)
+ };
+
Target {
- kind: TargetKind::Example,
+ kind: kind,
name: name.to_string(),
benched: false,
..Target::with_path(src_path)
}
pub fn is_bin(&self) -> bool { self.kind == TargetKind::Bin }
- pub fn is_example(&self) -> bool { self.kind == TargetKind::Example }
+
+ pub fn is_example(&self) -> bool {
+ match self.kind {
+ TargetKind::ExampleBin |
+ TargetKind::ExampleLib(..) => true,
+ _ => false
+ }
+ }
+
pub fn is_test(&self) -> bool { self.kind == TargetKind::Test }
pub fn is_bench(&self) -> bool { self.kind == TargetKind::Bench }
pub fn is_custom_build(&self) -> bool { self.kind == TargetKind::CustomBuild }
/// Returns the arguments suitable for `--crate-type` to pass to rustc.
pub fn rustc_crate_types(&self) -> Vec<&str> {
match self.kind {
- TargetKind::Lib(ref kinds) => {
- kinds.iter().map(|kind| kind.crate_type()).collect()
- },
+ TargetKind::Lib(ref kinds) |
+ TargetKind::ExampleLib(ref kinds) => {
+ kinds.iter().map(LibKind::crate_type).collect()
+ }
TargetKind::CustomBuild |
TargetKind::Bench |
TargetKind::Test |
- TargetKind::Example |
+ TargetKind::ExampleBin |
TargetKind::Bin => vec!["bin"],
}
}
TargetKind::Bin => write!(f, "Target(bin: {})", self.name),
TargetKind::Test => write!(f, "Target(test: {})", self.name),
TargetKind::Bench => write!(f, "Target(bench: {})", self.name),
- TargetKind::Example => write!(f, "Target(example: {})", self.name),
+ TargetKind::ExampleBin |
+ TargetKind::ExampleLib(..) => write!(f, "Target(example: {})", self.name),
TargetKind::CustomBuild => write!(f, "Target(script)"),
}
}
use semver::Version;
-use core::{Dependency, Manifest, PackageId, SourceId, Target, TargetKind};
+use core::{Dependency, Manifest, PackageId, SourceId, Target};
use core::{Summary, SourceMap};
use ops;
use util::{CargoResult, Config, LazyCell, ChainError, internal, human, lev_distance};
self.targets().iter().any(|t| t.is_custom_build())
}
- pub fn find_closest_target(&self, target: &str, kind: TargetKind) -> Option<&Target> {
+ pub fn find_closest_target(&self, target: &str, is_expected_kind: fn(&Target)-> bool) -> Option<&Target> {
let targets = self.targets();
- let matches = targets.iter().filter(|t| *t.kind() == kind)
+ let matches = targets.iter().filter(|t| is_expected_kind(t))
.map(|t| (lev_distance(target, t.name()), t))
.filter(|&(d, _)| d < 4);
matches.min_by_key(|t| t.0).map(|t| t.1)
TargetKind::Bin => bins,
TargetKind::Test => tests,
TargetKind::Bench => benches,
- TargetKind::Example => examples,
+ TargetKind::ExampleBin |
+ TargetKind::ExampleLib(..) => examples,
TargetKind::Lib(..) => return lib,
TargetKind::CustomBuild => return false,
};
}
{
- let mut find = |names: &[String], desc, kind, profile| {
+ let mut find = |names: &[String], desc, is_expected_kind: fn(&Target) -> bool, profile| {
for name in names {
let target = pkg.targets().iter().find(|t| {
- t.name() == *name && *t.kind() == kind
+ t.name() == *name && is_expected_kind(t)
});
let t = match target {
Some(t) => t,
None => {
- let suggestion = pkg.find_closest_target(name, kind);
+ let suggestion = pkg.find_closest_target(name, is_expected_kind);
match suggestion {
Some(s) => {
let suggested_name = s.name();
}
Ok(())
};
- find(bins, "bin", TargetKind::Bin, profile)?;
- find(examples, "example", TargetKind::Example, build)?;
- find(tests, "test", TargetKind::Test, test)?;
- find(benches, "bench", TargetKind::Bench, &profiles.bench)?;
+ find(bins, "bin", Target::is_bin, profile)?;
+ find(examples, "example", Target::is_example, build)?;
+ find(tests, "test", Target::is_test, test)?;
+ find(benches, "bench", Target::is_bench, &profiles.bench)?;
}
Ok(targets)
}
for unit in units {
self.visit_crate_type(unit, &mut crate_types)?;
}
+ debug!("probe_target_info: crate_types={:?}", crate_types);
self.probe_target_info_kind(&crate_types, Kind::Target)?;
if self.requested_target().is_none() {
self.host_info = self.target_info.clone();
};
match *unit.target.kind() {
- TargetKind::Example |
TargetKind::Bin |
TargetKind::CustomBuild |
+ TargetKind::ExampleBin |
TargetKind::Bench |
TargetKind::Test => {
add("bin", false)?;
}
- TargetKind::Lib(..) if unit.profile.test => {
+ TargetKind::Lib(..) |
+ TargetKind::ExampleLib(..)
+ if unit.profile.test => {
add("bin", false)?;
}
- TargetKind::Lib(ref libs) => {
- for lib in libs {
- add(lib.crate_type(), lib.linkable())?;
+ TargetKind::ExampleLib(ref kinds) |
+ TargetKind::Lib(ref kinds) => {
+ for kind in kinds {
+ add(kind.crate_type(), kind.linkable())?;
}
}
}
TargetKind::Lib(..) => "lib",
TargetKind::Bin => "bin",
TargetKind::Test => "integration-test",
- TargetKind::Example => "example",
+ TargetKind::ExampleBin |
+ TargetKind::ExampleLib(..) => "example",
TargetKind::Bench => "bench",
TargetKind::CustomBuild => "build-script",
};
PathValue::Path(default(ex))
});
- let mut target = Target::example_target(&ex.name(), package_root.join(path.to_path()));
+ let crate_types = match ex.crate_type {
+ Some(ref kinds) => kinds.iter().map(|s| LibKind::from_str(s)).collect(),
+ None => Vec::new()
+ };
+
+ let mut target = Target::example_target(
+ &ex.name(),
+ crate_types,
+ package_root.join(path.to_path())
+ );
configure(ex, &mut target);
dst.push(target);
}